/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package GestorClinico;

import Servicios.Conexion;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * @file Estadisticas.java
 * @brief Implementa la clase EstadisticasDAO encargada de la conección de Estadisticas con la BD.
 *
 * Realiza las consultas a la BD.
 *
 * @author José Ángel Carvajal Soto
 * @version 1.0
 *
 */
 class EstadisticasDAO {

    /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener obtine el número de citas por días de la semana.
         * @param mes el cual se hará la consulta.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
     public static ArrayList<ArrayList<String>> getCitasDia(Integer mes) throws SQLException, IOException, ClassNotFoundException{
        ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
        Conexion.conectar();

        ResultSet rs = Conexion.consultar(""
                + "SELECT date_format(fechaCita, \"%W\") AS 'DS', Count(idCita) AS `Cuenta` "
                + "FROM `Cita` "
                + "WHERE month(fechaCita) = "+mes.toString()+" "
                + "group by date_format(fechaCita, \"%W\");"
                );
	while(rs.next()) { // Encontrado
            ArrayList<String> fila = new ArrayList<String>();
            fila.add(rs.getString("DS"));
            fila.add(rs.getString("Cuenta"));
            result.add(fila);
	}

        Conexion.desconectar();

        return result;
    }

     /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener el número de pacientes por edad.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
     public static ArrayList<ArrayList<String>> getPacienteEdad () throws SQLException, IOException, ClassNotFoundException{
        ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
        Conexion.conectar();

        ResultSet rs = Conexion.consultar(""
                + "SELECT COUNT(*) AS 'Cuenta', (YEAR(NOW())-YEAR(`fechaNacimiento`)) AS 'Edad' "
                + "FROM Usuario "
                + "WHERE tipoUsuario = 'p' "
                + "GROUP BY Edad;"
                );
	while(rs.next()) { // Encontrado
            ArrayList<String> fila = new ArrayList<String>();
            fila.add(rs.getString("Edad"));
            fila.add(rs.getString("Cuenta"));
            result.add(fila);
	}

        Conexion.desconectar();

        return result;
    }

     /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener el número de citas por edad.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
     public static ArrayList<ArrayList<String>> getCitasEdad () throws SQLException, IOException, ClassNotFoundException{
        ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
        Conexion.conectar();

        ResultSet rs = Conexion.consultar(""
                + "SELECT (YEAR(NOW())-YEAR(`fechaNacimiento`)) AS 'Edad', COUNT (*) AS veces "
                + "FROM Usuario, Cita WHERE Usuario.idUsuario = Cita.idUsuario "
                + "group by edad "
                + "order by veces DESC;"
                );
	while(rs.next()) { // Encontrado
            ArrayList<String> fila = new ArrayList<String>();
            fila.add(rs.getString("Edad"));
            fila.add(rs.getString("Veces"));
            result.add(fila);
	}

        Conexion.desconectar();

        return result;
    }

     /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener el número de empleados por tipo
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
     public static ArrayList<ArrayList<String>> getEmpleadosTipo () throws SQLException, IOException, ClassNotFoundException{
         ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
         Conexion.conectar();

         ResultSet rs = Conexion.consultar(""
                 + "SELECT tipoUsuario AS Tipo, Count(*) AS Cuenta "
                 + "FROM `Usuario` "
                 + "WHERE NOT tipoUsuario = 'p' "
                 + "group by tipoUsuario ;"
                 );
         while(rs.next()) { // Encontrado
             ArrayList<String> fila = new ArrayList<String>();
             fila.add(rs.getString("Tipo"));
             fila.add(rs.getString("Cuenta"));
             result.add(fila);
	}

         Conexion.desconectar();

         return result;
    }

     /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener el número de pacientes por genero.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
     public static ArrayList<ArrayList<String>> getGeneros () throws SQLException, IOException, ClassNotFoundException{
         ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
         Conexion.conectar();

         ResultSet rs = Conexion.consultar("SELECT genero, Count(*) AS Cuenta FROM `Usuario` group by genero;");
         while(rs.next()) { // Encontrado
             ArrayList<String> fila = new ArrayList<String>();
             fila.add(rs.getString("genero"));
             fila.add(rs.getString("Cuenta"));
             result.add(fila);
         }

         Conexion.desconectar();

         return result;
     }

        /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener las pruebas segun su tipo
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
      public static ArrayList<ArrayList<String>> getPruebas() throws SQLException, IOException, ClassNotFoundException{
             ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
             Conexion.conectar();
             String[] str={"Bioquimica","Hematologia","Hemostasia","Hormonas","MarcadoresTumorales","Urianalisis","Radiografia"};

            ResultSet rs;

            for(String prueba : str){
            rs = Conexion.consultar("SELECT Count(*) AS Cuenta FROM Prueba"+prueba+";");

            while(rs.next()) { // Encontrado
                ArrayList<String> fila = new ArrayList<String>();
                fila.add(prueba);
                fila.add(rs.getString("Cuenta"));
                result.add(fila);
                }
            }

            Conexion.desconectar();

            return result;
    }

        /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener los n médicos con más citas
         * @param inicio indica el inicio del periodo de busqueda.
         * @param fin indica el fin del periodo de busqueda.
         * @param tamanio del conjuto de datos.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
       public static ArrayList<ArrayList<String>> getMedicoCita (Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
            ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
            Conexion.conectar();

            DateFormat formato = new SimpleDateFormat("yyyy-MM-dd");

            ResultSet rs = Conexion.consultar(""
                + "SELECT nombre AS Nombre, COUNT(*) AS Veces "
                + "FROM Usuario, Cita "
                + "WHERE Usuario.idUsuario = Cita.idMedico "
                + "AND Cita.estado = 'f'"
                + "AND `fechaCita` > DATE('"+formato.format(inicio)+"') "
                + "AND `fechaCita` < DATE('"+formato.format(fin)+"') "
                + "group by Nombre "
                + "order by veces DESC "
                + "LIMIT 0 , "+tamanio.toString()+";"
                );
            while(rs.next()) { // Encontrado
                ArrayList<String> fila = new ArrayList<String>();
                fila.add(rs.getString("Nombre"));
                fila.add(rs.getString("Veces"));
                result.add(fila);
            }

            Conexion.desconectar();

            return result;
    }

       /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener los n pacientes con más citas
         * @param inicio indica el inicio del periodo de busqueda.
         * @param fin indica el fin del periodo de busqueda.
         * @param tamanio del conjuto de datos.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
       public static ArrayList<ArrayList<String>> getPacienteCita (Date inicio, Date fin,Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
            ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
            Conexion.conectar();

            DateFormat formato = new SimpleDateFormat("yyyy-MM-dd");

            ResultSet rs = Conexion.consultar(""
                + "SELECT nombre AS Nombre, COUNT(*) AS Veces "
                + "FROM Usuario, Cita "
                + "WHERE Usuario.idUsuario = Cita.idUsuario "
                + "AND `fechaCita` > DATE('"+formato.format(inicio)+"') "
                + "AND `fechaCita` < DATE('"+formato.format(fin)+"') "
                + "group by Nombre "
                + "order by veces DESC "
                + "LIMIT 0 , "+tamanio.toString()+";"
                );
            while(rs.next()) { // Encontrado
                ArrayList<String> fila = new ArrayList<String>();
                fila.add(rs.getString("Nombre"));
                fila.add(rs.getString("Veces"));
                result.add(fila);
            }

            Conexion.desconectar();

            return result;
    }

       /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener los farmacos mas solicitados
         * @param inicio indica el inicio del periodo de busqueda.
         * @param fin indica el fin del periodo de busqueda.
         * @param tamanio del conjuto de datos.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
        public static ArrayList<ArrayList<String>> getLote (Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
            ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
            Conexion.conectar();

            DateFormat formato = new SimpleDateFormat("yyyy-MM-dd");

            ResultSet rs = Conexion.consultar(""
                + "SELECT nombre AS Nombre, Count(*) AS Veces "
                + "FROM lote, Medicamento "
                + "WHERE esDe = idMedicamento "
                + "AND `fechaLlegada` > DATE('"+formato.format(inicio)+"') "
                + "AND `fechaLlegada` < DATE('"+formato.format(fin)+"') "
                + "group by Nombre "
                + "order by veces DESC "
                + "LIMIT 0 , "+tamanio.toString()+";"
                );
            while(rs.next()) { // Encontrado

                ArrayList<String> fila = new ArrayList<String>();
                fila.add(rs.getString("Nombre"));
                fila.add(rs.getString("Veces"));
                result.add(fila);
            }

            Conexion.desconectar();

            return result;
        }

         /**
         * @author José Ángel Carvajal Soto
         * @brief Consulta la BD para obtener los farmacos más recetados
         * @param inicio indica el inicio del periodo de busqueda.
         * @param fin indica el fin del periodo de busqueda.
         * @param tamanio del conjuto de datos.
         * @return una array con el resultado de la consulta.
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
        public static ArrayList<ArrayList<String>> getFarmacoMasPedido (Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
            
            ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
            Conexion.conectar();

            DateFormat formato = new SimpleDateFormat("yyyy-MM-dd");

            ResultSet rs = Conexion.consultar(""
                + "SELECT nombre AS Nombre, SUM(CEILING(numTomas/dosisPorUnidad)) AS 'Paquetes' "
                + "FROM `Medicamento`, lineaReceta "
                + "WHERE idMedicamento = deUn "
                + "AND `fechaInicio` > DATE('"+formato.format(inicio)+"') "
                + "AND `fechaInicio` < DATE('"+formato.format(fin)+"') "
                + "group by nombre "
                + "order by Paquetes DESC "
                + "LIMIT 0 , "+tamanio.toString()+";"
                );

	while(rs.next()) {

            ArrayList<String> fila = new ArrayList<String>();
            fila.add(rs.getString("Nombre"));
            fila.add(rs.getString("Paquetes"));
            result.add(fila);
	}

        Conexion.desconectar();

        return result;
    }
}
